Poglobljen vpogled v aplikacijski in zahtevni kontekst v Flasku, ključen za izdelavo robustnih, razširljivih in mednarodno usmerjenih spletnih aplikacij. Naučite se jih učinkovito upravljati.
Obvladovanje upravljanja aplikacijskega in zahtevnega konteksta v Flasku za globalne aplikacije
V dinamičnem svetu spletnega razvoja, še posebej pri gradnji aplikacij za globalno občinstvo, je razumevanje temeljnih mehanizmov, ki upravljajo vaše ogrodje, ključnega pomena. Flask, lahko in prilagodljivo spletno ogrodje za Python, ponuja zmogljiva orodja za upravljanje stanja aplikacije in podatkov, specifičnih za posamezno zahtevo. Med njimi sta aplikacijski kontekst in kontekst zahteve temeljna koncepta, ki, če sta pravilno razumljena in uporabljena, lahko vodita do bolj robustnih, razširljivih in vzdržljivih aplikacij. Ta celovit vodnik bo demistificiral ta konteksta, raziskal njun namen, kako delujeta in kako ju učinkovito izkoristiti za globalne spletne aplikacije.
Razumevanje temeljnih konceptov: Konteksti v Flasku
Preden se poglobimo v podrobnosti aplikacijskega in zahtevnega konteksta, vzpostavimo temeljno razumevanje, kaj 'kontekst' pomeni v tem scenariju. V Flasku je kontekst način, kako določene objekte, kot sta trenutna zahteva ali sama aplikacija, narediti enostavno dostopne znotraj vaše kode, še posebej, ko niste neposredno znotraj funkcije pogleda (view function).
Potreba po kontekstih
Predstavljajte si, da gradite aplikacijo Flask, ki služi uporabnikom na različnih celinah. Ena sama zahteva lahko vključuje:
- Dostopanje do konfiguracij, ki veljajo za celotno aplikacijo (npr. poverilnice za bazo podatkov, API ključi).
- Pridobivanje informacij, specifičnih za uporabnika (npr. jezikovne nastavitve, podatki seje).
- Izvajanje operacij, ki so edinstvene za to specifično zahtevo (npr. beleženje podrobnosti zahteve, obdelava oddanih obrazcev).
Brez strukturiranega načina za upravljanje teh različnih informacij bi vaša koda postala prenatrpana in težko razumljiva. Konteksti zagotavljajo to strukturo. Flask za to uporablja proksije (proxies). Proksiji so objekti, ki svoje operacije prenesejo na drug objekt, ki se določi med izvajanjem. Dva glavna proksija v Flasku sta current_app
in g
(za kontekst zahteve), current_app
pa lahko predstavlja tudi aplikacijski kontekst.
Aplikacijski kontekst v Flasku
Aplikacijski kontekst je objekt, ki shranjuje podatke, specifične za aplikacijo, ki so na voljo skozi celotno življenjsko dobo zahteve aplikacije. V bistvu je to vsebnik za informacije na ravni aplikacije, ki morajo biti globalno dostopne znotraj vaše aplikacije Flask, hkrati pa morajo biti ločene za vsak delujoč primerek aplikacije (še posebej pri postavitvah z več aplikacijami).
Kaj upravlja:
Aplikacijski kontekst primarno upravlja:
- Primerek aplikacije: Sam trenutni primerek aplikacije Flask. Dostop do njega je mogoč preko proksija
current_app
. - Konfiguracija: Konfiguracijske nastavitve aplikacije (npr. iz
app.config
). - Razširitve: Informacije, povezane z razširitvami Flaska, integriranimi v aplikacijo.
Kako deluje:
Flask samodejno potisne (aktivira) aplikacijski kontekst, ko:
- Se obdeluje zahteva.
- Uporabite dekorator
@app.appcontext
ali blokwith app.app_context():
.
Ko je aplikacijski kontekst aktiven, proksi current_app
kaže na pravilen primerek aplikacije Flask. To je ključnega pomena za aplikacije, ki imajo morda več delujočih aplikacij Flask, ali ko morate dostopati do virov na ravni aplikacije izven običajnega obdelovalca zahtev (npr. v ozadnih opravilih, ukazih CLI ali pri testiranju).
Ročno potiskanje aplikacijskega konteksta:
V določenih primerih boste morda morali izrecno potisniti aplikacijski kontekst. To je pogosto pri delu s Flaskom izven cikla zahteve, na primer v ukaznih vmesnikih po meri (CLI) ali med testiranjem. To lahko dosežete z metodo app.app_context()
, običajno znotraj stavka with
:
from flask import Flask, current_app
app = Flask(__name__)
app.config['MY_SETTING'] = 'Global Value'
# Outside a request, you need to push the context to use current_app
with app.app_context():
print(current_app.config['MY_SETTING']) # Output: Global Value
# Example in a CLI command (using Flask-CLI)
@app.cli.command('show-setting')
def show_setting_command():
with app.app_context():
print(f"My setting is: {current_app.config['MY_SETTING']}")
To eksplicitno upravljanje konteksta zagotavlja, da je current_app
vedno vezan na pravilen primerek aplikacije, kar preprečuje napake in omogoča dostop do virov na ravni celotne aplikacije.
Globalne aplikacije in aplikacijski kontekst:
Za globalne aplikacije je aplikacijski kontekst ključen za upravljanje deljenih virov in konfiguracij. Na primer, če mora vaša aplikacija naložiti različne nabore podatkov za internacionalizacijo (i18n) ali lokalizacijo (l10n) glede na jezik zahteve, lahko proksi current_app
dostopa do konfiguracije, ki kaže na te vire. Čeprav bo kontekst zahteve vseboval specifičen jezik za uporabnika, je current_app
vstopna točka za dostop do celotne i18n nastavitve aplikacije.
Kontekst zahteve v Flasku
Kontekst zahteve je bolj prehoden kot aplikacijski kontekst. Ustvari in uniči se za vsako dohodno zahtevo v vaši aplikaciji Flask. Vsebuje podatke, ki so specifični za trenutno HTTP zahtevo in so ključni za obravnavo posameznih interakcij uporabnikov.
Kaj upravlja:
Kontekst zahteve primarno upravlja:
- Objekt zahteve: Dohodna HTTP zahteva, dostopna preko proksija
request
. - Objekt odgovora: Odhodni HTTP odgovor.
- Seja: Podatki uporabniške seje, dostopni preko proksija
session
. - Globalni podatki (
g
): Poseben objektg
, ki ga lahko uporabite za shranjevanje poljubnih podatkov med eno samo zahtevo. Pogosto se uporablja za shranjevanje povezav z bazo podatkov, uporabniških objektov ali drugih objektov, specifičnih za zahtevo, do katerih morajo dostopati različni deli vaše aplikacije med to zahtevo.
Kako deluje:
Flask samodejno potisne kontekst zahteve, kadarkoli se obdeluje dohodna HTTP zahteva. Ta kontekst se potisne na vrh aplikacijskega konteksta. To pomeni, da so znotraj obdelovalca zahteve na voljo tako current_app
kot request
(in g
, session
).
Ko je obdelava zahteve končana (bodisi z vrnitvijo odgovora ali sprožitvijo izjeme), Flask odstrani kontekst zahteve. To čiščenje zagotavlja, da se sprostijo viri, povezani s to specifično zahtevo.
Dostopanje do podatkov, specifičnih za zahtevo:
Tukaj je tipičen primer znotraj funkcije pogleda:
from flask import Flask, request, g, session, current_app
app = Flask(__name__)
app.secret_key = 'your secret key'
@app.route('/')
def index():
# Accessing request data
user_agent = request.headers.get('User-Agent')
user_ip = request.remote_addr
# Accessing application data via current_app
app_name = current_app.name
# Storing data in g for this request
g.request_id = 'some-unique-id-123'
# Setting session data (requires secret_key)
session['username'] = 'global_user_example'
return f"Hello! Your IP is {user_ip}, User Agent: {user_agent}. App: {app_name}. Request ID: {g.request_id}. Session user: {session.get('username')}"
@app.route('/profile')
def profile():
# Accessing g data set in another view during the same request cycle
# Note: This is only if the /profile route was accessed via a redirect or internal
# forward from the '/' route within the same request. In practice, it's better
# to pass data explicitly or use session.
request_id_from_g = getattr(g, 'request_id', 'Not set')
return f"Profile page. Request ID (from g): {request_id_from_g}"
V tem primeru so request
, g
, session
in current_app
vsi dostopni, ker je Flask samodejno potisnil aplikacijski in zahtevni kontekst.
Ročno potiskanje konteksta zahteve:
Čeprav Flask običajno samodejno poskrbi za potiskanje konteksta zahteve med HTTP zahtevami, obstajajo situacije, kjer boste morda morali simulirati kontekst zahteve za testiranje ali ozadno obdelavo. To lahko storite z uporabo app.request_context()
. To se pogosto uporablja v povezavi z app.app_context()
.
from flask import Flask, request, current_app
app = Flask(__name__)
app.config['MY_SETTING'] = 'Global Value'
# Simulate a request context
with app.test_request_context('/test', method='GET', headers={'User-Agent': 'TestClient'}):
print(request.method) # Output: GET
print(request.headers.get('User-Agent')) # Output: TestClient
print(current_app.name) # Output: __main__ (or your app's name)
# You can even use g within this simulated context
g.test_data = 'Some test info'
print(g.test_data) # Output: Some test info
Metoda test_request_context
je priročen način za ustvarjanje navideznega okolja zahteve za vaše teste, kar vam omogoča preverjanje, kako se vaša koda obnaša v različnih pogojih zahteve, ne da bi potrebovali delujoč strežnik.
Odnos med aplikacijskim in zahtevnim kontekstom
Ključnega pomena je razumeti, da ta konteksta nista neodvisna; tvorita sklad (stack).
- Aplikacijski kontekst je osnova: Potisne se prvi in ostane aktiven, dokler aplikacija teče ali dokler ni izrecno odstranjen.
- Kontekst zahteve je na vrhu: Potisne se za aplikacijskim kontekstom in je aktiven samo med trajanjem ene same zahteve.
Ko pride zahteva, Flask naredi naslednje:
- Potisne aplikacijski kontekst: Če ni aktiven noben aplikacijski kontekst, ga potisne. To zagotavlja, da je
current_app
na voljo. - Potisne kontekst zahteve: Nato potisne kontekst zahteve, s čimer postanejo dostopni
request
,g
insession
.
Ko je zahteva končana:
- Odstrani kontekst zahteve: Flask odstrani kontekst zahteve.
- Odstrani aplikacijski kontekst: Če noben drug del vaše aplikacije ne drži reference na aktiven aplikacijski kontekst, se lahko odstrani tudi ta. Vendar pa običajno aplikacijski kontekst obstaja, dokler je proces aplikacije živ.
Ta zložena narava je razlog, zakaj je current_app
vedno na voljo, ko je na voljo request
, medtem ko request
ni nujno na voljo, ko je na voljo current_app
(npr. ko ročno potisnete samo aplikacijski kontekst).
Upravljanje kontekstov v globalnih aplikacijah
Gradnja aplikacij za raznoliko globalno občinstvo predstavlja edinstvene izzive. Upravljanje konteksta igra ključno vlogo pri reševanju teh izzivov:
1. Internacionalizacija (i18n) in lokalizacija (l10n):
Izziv: Uporabniki iz različnih držav govorijo različne jezike in imajo različna kulturna pričakovanja (npr. oblike zapisa datumov, simboli valut). Vaša aplikacija se mora prilagoditi.
Rešitev s kontekstom:
- Aplikacijski kontekst:
current_app
lahko vsebuje konfiguracijo za vašo i18n nastavitev (npr. razpoložljivi jeziki, poti do prevodnih datotek). Ta konfiguracija je globalno na voljo aplikaciji. - Kontekst zahteve: Objekt
request
se lahko uporabi za določitev želenega jezika uporabnika (npr. iz glaveAccept-Language
, poti URL-ja ali uporabnikovega profila, shranjenega v seji). Objektg
se nato lahko uporabi za shranjevanje določene lokalizacije (locale) za trenutno zahtevo, kar omogoča enostaven dostop vsem delom vaše logike pogleda in predlogam.
Primer (z uporabo Flask-Babel):
from flask import Flask, request, g, current_app
from flask_babel import Babel, get_locale
app = Flask(__name__)
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
app.config['BABEL_DEFAULT_TIMEZONE'] = 'UTC'
babel = Babel(app)
# Application context is implicitly pushed by Flask-Babel during initialization
# and will be available during requests.
@babel.localeselector
def get_locale():
# Try to get language from URL first (e.g., /en/about)
if 'lang' in request.view_args:
g.current_lang = request.view_args['lang']
return request.view_args['lang']
# Try to get language from user's browser headers
user_lang = request.accept_languages.best_match(app.config['LANGUAGES'])
if user_lang:
g.current_lang = user_lang
return user_lang
# Fallback to application default
g.current_lang = app.config['BABEL_DEFAULT_LOCALE']
return app.config['BABEL_DEFAULT_LOCALE']
@app.route('//hello')
def hello_lang(lang):
# current_app.config['BABEL_DEFAULT_LOCALE'] is accessible
# g.current_lang was set by get_locale()
return f"Hello in {g.current_lang}!"
@app.route('/hello')
def hello_default():
# get_locale() will be called automatically
return f"Hello in {get_locale()}!"
Tukaj current_app
omogoča dostop do privzete konfiguracije lokalizacije, medtem ko se request
in g
uporabljata za določanje in shranjevanje specifične lokalizacije za zahtevo trenutnega uporabnika.
2. Časovni pasovi in obravnava datumov/časov:
Izziv: Različni uporabniki so v različnih časovnih pasovih. Shranjevanje in prikazovanje časovnih žigov mora biti natančno in relevantno za uporabnika.
Rešitev s kontekstom:
- Aplikacijski kontekst:
current_app
lahko hrani privzeti časovni pas strežnika ali osnovni časovni pas za vse časovne žige, shranjene v bazi podatkov. - Kontekst zahteve: Objekt
request
(ali podatki, pridobljeni iz uporabniškega profila/seje) lahko določi lokalni časovni pas uporabnika. Ta časovni pas se lahko shrani vg
za enostaven dostop pri formatiranju datumov in časov za prikaz znotraj te specifične zahteve.
Primer:
from flask import Flask, request, g, current_app
from datetime import datetime
import pytz # A robust timezone library
app = Flask(__name__)
app.config['SERVER_TIMEZONE'] = 'UTC'
# Function to get user's timezone (simulated)
def get_user_timezone(user_id):
# In a real app, this would query a database or session
timezones = {'user1': 'America/New_York', 'user2': 'Asia/Tokyo'}
return timezones.get(user_id, app.config['SERVER_TIMEZONE'])
@app.before_request
def set_timezone():
# Simulate a logged-in user
user_id = 'user1'
g.user_timezone_str = get_user_timezone(user_id)
g.user_timezone = pytz.timezone(g.user_timezone_str)
@app.route('/time')
def show_time():
now_utc = datetime.now(pytz.utc)
# Format time for the current user's timezone
now_user_tz = now_utc.astimezone(g.user_timezone)
formatted_time = now_user_tz.strftime('%Y-%m-%d %H:%M:%S %Z%z')
# Accessing application's base timezone
server_tz_str = current_app.config['SERVER_TIMEZONE']
return f"Current time in your timezone ({g.user_timezone_str}): {formatted_time}
Server is set to: {server_tz_str}"
To prikazuje, kako lahko g
hrani podatke, specifične za zahtevo, kot je uporabnikov časovni pas, kar omogoča enostavno uporabo pri formatiranju časa, medtem ko current_app
hrani globalno nastavitev časovnega pasu strežnika.
3. Valute in obdelava plačil:
Izziv: Prikazovanje cen in obdelava plačil v različnih valutah je kompleksno.
Rešitev s kontekstom:
- Aplikacijski kontekst:
current_app
lahko shranjuje osnovno valuto aplikacije, podprte valute in dostop do storitev za pretvorbo valut ali konfiguracije. - Kontekst zahteve:
request
(ali seja/uporabniški profil) določi želeno valuto uporabnika. Ta se lahko shrani vg
. Pri prikazovanju cen pridobite osnovno ceno (pogosto shranjeno v konsistentni valuti) in jo pretvorite z uporabo želene valute uporabnika, ki je enostavno dostopna prekog
.
4. Povezave z bazo podatkov in viri:
Izziv: Učinkovito upravljanje povezav z bazo podatkov za veliko sočasnih zahtev. Različni uporabniki se bodo morda morali povezati z različnimi bazami podatkov glede na svojo regijo ali vrsto računa.
Rešitev s kontekstom:
- Aplikacijski kontekst: Lahko upravlja zbirko (pool) povezav z bazo podatkov ali konfiguracijo za povezovanje z različnimi primerki baz podatkov.
- Kontekst zahteve: Objekt
g
je idealen za shranjevanje specifične povezave z bazo podatkov, ki se bo uporabila za trenutno zahtevo. To preprečuje dodatne stroške vzpostavljanja nove povezave za vsako operacijo znotraj ene same zahteve in zagotavlja, da operacije z bazo podatkov ene zahteve ne motijo druge.
Primer:
from flask import Flask, g, request, current_app
import sqlite3
app = Flask(__name__)
app.config['DATABASE_URI_GLOBAL'] = 'global_data.db'
app.config['DATABASE_URI_USERS'] = 'user_specific_data.db'
def get_db(db_uri):
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect(db_uri)
# Optional: Configure how rows are returned (e.g., as dictionaries)
db.row_factory = sqlite3.Row
return db
@app.before_request
def setup_db_connection():
# Determine which database to use based on request, e.g., user's region
user_region = request.args.get('region', 'global') # 'global' or 'user'
if user_region == 'user':
# In a real app, user_id would come from session/auth
g.db_uri = current_app.config['DATABASE_URI_USERS']
else:
g.db_uri = current_app.config['DATABASE_URI_GLOBAL']
g.db = get_db(g.db_uri)
@app.teardown_request
def close_db_connection(exception):
db = getattr(g, '_database', None)
if db is not None:
db.close()
@app.route('/data')
def get_data():
cursor = g.db.execute('SELECT * FROM items')
items = cursor.fetchall()
return f"Data from {g.db_uri}: {items}"
# Example usage: /data?region=global or /data?region=user
Ta vzorec zagotavlja, da vsaka zahteva uporablja svojo lastno povezavo z bazo podatkov, ki se učinkovito odpre in zapre za to specifično zahtevo. current_app.config
omogoča dostop do različnih konfiguracij baz podatkov, g
pa upravlja aktivno povezavo za zahtevo.
Najboljše prakse za upravljanje konteksta v globalnih aplikacijah
1. Uporabljajte `g` za podatke, specifične za zahtevo:
Uporabite objekt g
za shranjevanje podatkov, ki so relevantni samo med trajanjem ene same zahteve (npr. povezave z bazo podatkov, avtenticirani uporabniški objekti, izračunane vrednosti, edinstvene za zahtevo). To ohranja podatke zahteve izolirane in preprečuje njihovo uhajanje med zahtevami.
2. Razumejte sklad:
Vedno se spomnite, da se kontekst zahteve potisne na vrh aplikacijskega konteksta. To pomeni, da je current_app
na voljo, ko je na voljo request
, ne pa nujno obratno. Bodite pozorni na to pri pisanju kode, ki se lahko izvaja izven celotnega cikla zahteve.
3. Po potrebi izrecno potisnite kontekste:
V enotskih testih, ozadnih opravilih ali ukazih CLI ne predpostavljajte, da je kontekst aktiven. Uporabite with app.app_context():
in with app.request_context(...):
za ročno upravljanje kontekstov in zagotovite, da proksiji, kot sta current_app
in request
, delujejo pravilno.
4. Uporabite `before_request` in `teardown_request` kljuke (hooks):
Ti dekoratorji v Flasku so zmogljivi za nastavitev in odstranjevanje virov, specifičnih za zahtevo, ki se upravljajo znotraj aplikacijskega in zahtevnega konteksta. Na primer, odpiranje in zapiranje povezav z bazo podatkov ali inicializacija odjemalcev za zunanje storitve.
5. Izogibajte se globalnim spremenljivkam za stanje:
Čeprav konteksti v Flasku omogočajo globalni dostop do specifičnih objektov (kot je current_app
), se izogibajte uporabi globalnih spremenljivk v Pythonu ali spremenljivk na ravni modula za shranjevanje spremenljivega stanja, ki mora biti specifično za zahtevo ali aplikacijo na način, ki obide sistem konteksta. Konteksti so zasnovani za varno in pravilno upravljanje tega stanja, še posebej v sočasnih okoljih.
6. Načrtujte za razširljivost in sočasnost:
Konteksti so bistveni za zagotavljanje nitne varnosti in razširljivosti aplikacij Flask. Vsaka nit običajno dobi svoj aplikacijski in zahtevni kontekst. S pravilno uporabo kontekstov (še posebej g
) zagotovite, da različne niti, ki obdelujejo različne zahteve, ne posegajo v podatke druga druge.
7. Pametno izkoristite razširitve:
Mnoge razširitve za Flask (kot so Flask-SQLAlchemy, Flask-Login, Flask-Babel) se močno zanašajo na aplikacijski in zahtevni kontekst. Razumejte, kako te razširitve uporabljajo kontekste za upravljanje lastnega stanja in virov. To znanje bo olajšalo odpravljanje napak in integracijo po meri.
Konteksti v naprednih scenarijih
Sočasnost in večnitnost:
Spletni strežniki pogosto obravnavajo več zahtev sočasno z uporabo niti ali asinhronih delavcev. Vsaka nit, ki obdeluje zahtevo, samodejno dobi svoj aplikacijski in zahtevni kontekst. Ta izolacija je ključna. Če bi za, recimo, ID trenutnega uporabnika uporabili preprosto globalno spremenljivko, bi lahko različne niti prepisovale vrednosti druga drugi, kar bi vodilo do nepredvidljivega obnašanja in varnostnih ranljivosti. Objekt g
, vezan na kontekst zahteve, zagotavlja, da so podatki vsake niti ločeni.
Testiranje:
Učinkovito testiranje aplikacij Flask je močno odvisno od upravljanja konteksta. Metoda test_client()
v Flasku vrne testnega odjemalca, ki simulira zahteve. Ko uporabljate tega odjemalca, Flask samodejno potisne potrebna aplikacijska in zahtevna konteksta, kar vaši testni kodi omogoča dostop do proksijev, kot so request
, session
in current_app
, kot da bi se dogajala resnična zahteva.
from flask import Flask, session, current_app
app = Flask(__name__)
app.secret_key = 'testing_key'
@app.route('/login')
def login():
session['user'] = 'test_user'
return 'Logged in'
@app.route('/user')
def get_user():
return session.get('user', 'No user')
# Test using the test client
client = app.test_client()
response = client.get('/login')
assert response.status_code == 200
# Session data is now set within the test client's context
response = client.get('/user')
assert response.get_data(as_text=True) == 'test_user'
# current_app is also available
with app.test_client() as c:
with c.application.app_context(): # Explicitly push app context if needed
print(current_app.name)
Ozadna opravila (npr. Celery):
Ko prenesete opravila na ozadne delavce (kot so tisti, ki jih upravlja Celery), ti delavci pogosto tečejo v ločenih procesih ali nitih, izven cikla zahteve glavnega spletnega strežnika. Če mora vaše ozadno opravilo dostopati do konfiguracije aplikacije ali izvajati operacije, ki zahtevajo aplikacijski kontekst, morate pred izvedbo opravila ročno potisniti aplikacijski kontekst.
from your_flask_app import create_app # Assuming you have a factory pattern
from flask import current_app
@celery.task
def process_background_data(data):
app = create_app() # Get your Flask app instance
with app.app_context():
# Now you can safely use current_app
config_value = current_app.config['SOME_BACKGROUND_SETTING']
# ... perform operations using config_value ...
print(f"Processing with config: {config_value}")
return "Task completed"
Če v takšnih primerih ne potisnete aplikacijskega konteksta, bo pri poskusu dostopa do current_app
ali drugih objektov, odvisnih od konteksta, prišlo do napak.
Zaključek
Aplikacijski kontekst in kontekst zahteve v Flasku sta temeljna elementa za gradnjo katere koli aplikacije Flask in postaneta še bolj ključna pri načrtovanju za globalno občinstvo. Z razumevanjem, kako ti konteksti upravljajo podatke, specifične za aplikacijo in zahtevo, ter z uporabo najboljših praks za njihovo uporabo, lahko ustvarite aplikacije, ki so:
- Robustne: Manj nagnjene k težavam s sočasnostjo in uhajanjem stanja.
- Razširljive: Sposobne učinkovito obvladovati naraščajoče obremenitve in sočasne uporabnike.
- Vzdržljive: Lažje za razumevanje in odpravljanje napak zaradi organiziranega upravljanja stanja.
- Mednarodno ozaveščene: Sposobne prilagajanja preferencam uporabnikov glede jezika, časovnih pasov, valut in še več.
Obvladovanje upravljanja konteksta v Flasku ni le učenje funkcije ogrodja; gre za gradnjo trdnih temeljev za kompleksne, sodobne spletne aplikacije, ki služijo uporabnikom po vsem svetu. Sprejmite te koncepte, eksperimentirajte z njimi v svojih projektih in boste na dobri poti k razvoju sofisticiranih in globalno usmerjenih spletnih izkušenj.